package ljl.alg.wangzheng_camp.round1.bisection;

public class _367_perfect_square {
    
    /**
     * 我直接牛顿迭代了，不要脸了
     * <p>
     * 不要脸也没用，又做错了
     */
    public boolean isPerfectSquare_wrong(int num) {
        double next = num;
        while (true) {
            double last = next;
            next = (next + num / next) / 2;
            int intPart = (int) next;
            if (intPart * intPart == num && (int) next == next) return true;
            // 问题貌似处在。。
            // 如果是 double 肯定不会变小应该，应该判断和上一次变化大小决定是否退出
            // 如果变化太小就退出
//            if (intPart < num / intPart) return false;
            if (next - last < 1e-6) return false;
        }
    }
    
    /**
     * !
     */
    public boolean isPerfectSquare_ok(int num) {
        double next = num;
        while (true) {
            double last = next;
            next = (next + num / next) / 2;
            // 如果能开出正数来，变化小于 1 就可以退出了
            // 当然这是我的一个推测，没有证据
            if (last - next < 1) {
                int x = (int) next;
                return x * x == num;
            }
        }
    }
}